<?php

namespace app\admin\controller\rebate;

use app\common\controller\Backend;
use app\service\RebateService;

/**
 * 返利批次主管理
 *
 * @icon fa fa-circle-o
 */
class Batches extends Backend
{

    /**
     * Batches模型对象
     * @var \app\admin\model\rebate\Batches
     */
    protected $model = null;
    protected $noNeedLogin = ['checkCondition', 'dailyCheck', 'distributeTeamBonus','dailyRebateGuding'];

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\rebate\Batches;

    }


    /**
     * 手动触发返利
     * rebate/batches/trigger
     */
    public function trigger()
    {
        if ($this->request->isPost()) {
            $rebateService = new RebateService();
            
            // 获取自定义返利比例
            $customRatio = $this->request->post('rebate_ratio', null);
            
            // 如果提供了自定义比例，验证其有效性
            if ($customRatio !== null) {
                $customRatio = floatval($customRatio);
                if ($customRatio < 0 || $customRatio > 100) {
                    $this->error('返利比例必须在0-100之间', 'shop/report/index', '', 10);
                }
                // 如果比例为0，设置为null，让服务层按计算比例处理
                if ($customRatio == 0) {
                    $customRatio = null;
                }
            }
            
            $result = $rebateService->triggerRebate(true, $customRatio); // true表示手动触发，并传递自定义比例
            
            if ($result['status'] === 'success') {
                // 优先显示自定义消息（按比例返利时）
                if (isset($result['msg'])) {
                    $this->success($result['msg'] . '（第' . $result['period'] . '期）', 'shop/report/index', '', 10);
                } else {
                    $this->success('返利触发成功！第' . $result['period'] . '期返利完成', 'shop/report/index', '', 10);
                }
            } else {
                $this->error('返利触发失败：' . $result['msg'], 'shop/report/index', '', 10);
            }
        }
        
        // GET请求显示确认页面
        return $this->view->fetch();
    }
    
    /**
     * 检查返利触发条件
     */
    public function checkCondition()
    {
        $rebateService = new RebateService();
        
        // 获取当前状态信息
        $DividendPool = new \app\admin\model\DividendPool;
        $DividendPoolFirst = $DividendPool->getFirst();
        list($nextPeriod, $requiredProfit) = $rebateService->getNextPeriod($DividendPoolFirst);

        // 当前期利润
        $currentProfit = $DividendPoolFirst->newprofit;

        $data = [
            'current_profit' => $currentProfit,
            'required_profit' => $requiredProfit,
            'next_period' => $nextPeriod,
            'can_trigger' => $currentProfit >= $requiredProfit
        ];
        
        $this->success('获取成功', '', $data);
    }
    
    /**
     * 废弃
     */
    // public function initDividendPool()
    // {
    //     $amount = $this->request->post('amount', 0);
        
    //     if ($amount <= 0) {
    //         $this->error('金额必须大于0');
    //     }
        
    //     $dividendPool = new \app\admin\model\DividendPool();
    //     $currentBalance = $dividendPool->getBalance();
    //     $dividendPool->addBalance($amount);
    //     $newBalance = $dividendPool->getBalance();
        
    //     $this->success('分红池余额调整成功！原余额: ' . $currentBalance . ', 新余额: ' . $newBalance);
    // }
    
    /**
     * 查看分红池状态（废弃）
     */
    // public function dividendPoolStatus()
    // {
    //     $dividendPool = new \app\admin\model\DividendPool();
    //     $balance = $dividendPool->getBalance();
        
    //     // 获取总利润和分红池来源统计
    //     $rebateService = new RebateService();
    //     $totalProfit = $rebateService->calculateTotalProfit();
    //     $expectedPoolAmount = $totalProfit * 0.2; // 利润的20%进入分红池
        
    //     $data = [
    //         'current_balance' => $balance,
    //         'total_profit' => $totalProfit,
    //         'expected_pool_amount' => $expectedPoolAmount, // 预期分红池金额（利润的20%）
    //     ];
        
    //     $this->success('获取成功', '', $data);
    // }
    


    /**
     * 定时任务，每天固定返利
     */
    public function dailyRebateGuding()
    { 
        try {
            // 执行自动返利
            $rebateService = new RebateService();
            $result = $rebateService->triggerRebateGuding(false);
            
            if ($result['status'] === 'success') {
                $message = '每天返利执行成功！' . $result['period'] . '';
                \think\Log::info('[定时返利] ' . $message);
                
                // 如果是通过Web访问，返回成功信息
                if (request()->isAjax() || request()->isPost()) {
                    $this->success($message);
                } else {
                    echo $message . "\n";
                }
            } else {
                $message = '每天返利执行失败！: ' . $result['msg'];
                \think\Log::error('[定时返利] ' . $message);
                
                if (request()->isAjax() || request()->isPost()) {
                    $this->error($message);
                } else {
                    echo $message . "\n";
                }
            }
        } catch (\Exception $e) {
            $message = '定时返利任务执行异常: ' . $e->getMessage();
            \think\Log::error('[定时返利] ' . $message);
            
            if (request()->isAjax() || request()->isPost()) {
                $this->error($message);
            } else {
                echo $message . "\n";
            }
        }
    }

    /**
     * 定时任务 - 每天自动检查并执行返利
     * 用于计划任务调用
     * rebate/batches/dailyCheck
     */
    public function dailyCheck()
    {
        $rebateService = new RebateService();
        
        try {
            // 记录任务开始日志
            \think\Log::info('[定时返利] 开始执行每日返利检查任务');
            
            $DividendPool = new \app\admin\model\DividendPool;
            $DividendPoolFirst = $DividendPool->getFirst();
            list($nextPeriod, $requiredProfit) = $rebateService->getNextPeriod($DividendPoolFirst);

            // 当前期利润
            $currentProfit = $DividendPoolFirst->newprofit;
            
            
            \think\Log::info('[定时返利] 当前利润: ' . $currentProfit . ', 所需利润: ' . $requiredProfit);
            
            // 检查是否满足触发条件
            if ($currentProfit >= $requiredProfit) {
                \think\Log::info('[定时返利] 满足触发条件，开始执行返利操作');
                
                // 执行自动返利（非手动触发）
                $result = $rebateService->triggerRebate(false);
                
                if ($result['status'] === 'success') {
                    $message = '定时返利执行成功！第' . $result['period'] . '期返利完成';
                    \think\Log::info('[定时返利] ' . $message);
                    
                    // 如果是通过Web访问，返回成功信息
                    if (request()->isAjax() || request()->isPost()) {
                        $this->success($message);
                    } else {
                        echo $message . "\n";
                    }
                } else {
                    $message = '定时返利执行失败: ' . $result['msg'];
                    \think\Log::error('[定时返利] ' . $message);
                    
                    if (request()->isAjax() || request()->isPost()) {
                        $this->error($message);
                    } else {
                        echo $message . "\n";
                    }
                }
            } else {
                $message = '当前利润未达到触发条件，跳过本次返利';
                \think\Log::info('[定时返利] ' . $message);
                
                if (request()->isAjax() || request()->isPost()) {
                    $this->success($message, '', ['current_profit' => $currentProfit, 'required_profit' => $requiredProfit]);
                } else {
                    echo $message . "\n";
                }
            }
            
        } catch (\Exception $e) {
            $message = '定时返利任务执行异常: ' . $e->getMessage();
            \think\Log::error('[定时返利] ' . $message);
            
            if (request()->isAjax() || request()->isPost()) {
                $this->error($message);
            } else {
                echo $message . "\n";
            }
        }
    }



    /**
     * 当天分红池新增金额的20% 分给团队
     * 定时任务每天执行
     * rebate/batches/distributeTeamBonus
     */
    public function distributeTeamBonus()
    {
        try {
            // 获取当天开始和结束时间戳
            $todayStart = strtotime(date('Y-m-d 00:00:00'));
            $todayEnd = strtotime(date('Y-m-d 23:59:59'));
            
            // 查询当天分红池增加的金额总和
            $increaseAmount = \app\admin\model\dividend\pool\Log::where('createtime', '>=', $todayStart)
                ->where('createtime', '<=', $todayEnd)
                ->where('bian_type', '增加')
                ->sum('money');
            
            // 查询当天分红池减少的金额总和
            $decreaseAmount = \app\admin\model\dividend\pool\Log::where('createtime', '>=', $todayStart)
                ->where('createtime', '<=', $todayEnd)
                ->where('bian_type', '减少')
                ->sum('money');
            
            // 计算当天分红池新增金额
            $dailyIncrease = $increaseAmount - $decreaseAmount;
            
            // 如果当天没有新增金额，直接返回
            if ($dailyIncrease <= 0) {
                \think\Log::info('[团队加权] 当天分红池无新增金额，无需分配');
                $message = '当天分红池无新增金额，无需分配';
                if (request()->isAjax() || request()->isPost()) {
                    $this->success($message);
                } else {
                    echo $message . "\n";
                }
                return;
            }
            
            // 计算分配给团队的总金额（20%）
            $teamBonusTotal = $dailyIncrease * 0.2;
            
            // 每个等级分配的金额
            $bonusPerLevel = $teamBonusTotal / 4;
            
            $message = '[团队加权] 分配开始执行，当天新增金额: ' . $dailyIncrease . '，分配给团队总额: ' . $teamBonusTotal.'，V1-V4分别分配'.$bonusPerLevel;
            \think\Log::info($message);

            // 分配给V1等级用户
            $this->distributeBonusToLevel('V1', $bonusPerLevel);
            
            // 分配给V2等级用户
            $this->distributeBonusToLevel('V2', $bonusPerLevel);
            
            // 分配给V3等级用户
            $this->distributeBonusToLevel('V3', $bonusPerLevel);
            
            // 分配给V4等级用户
            $this->distributeBonusToLevel('V4', $bonusPerLevel);            
            
            
            if (request()->isAjax() || request()->isPost()) {
                $this->success($message);
            } else {
                echo $message . "\n";
            }
            
        } catch (\Exception $e) {
            $message = '[团队加权] 分配异常: ' . $e->getMessage();
            \think\Log::error($message);
            if (request()->isAjax() || request()->isPost()) {
                $this->error($message);
            } else {
                echo $message . "\n";
            }
        }
    }
    
    /**
     * 分配奖金给指定等级的用户
     * @param string $level 等级
     * @param float $totalAmount 总金额
     */
    private function distributeBonusToLevel($level, $totalAmount)
    {
        // 查询该等级的所有用户
        $users = \app\admin\model\User::where('team_level', $level)->select();
        
        if (empty($users)) {
            \think\Log::info('[团队加权] 等级 ' . $level . ' 无用户，无需分配');
            return;
        }
        
        $userCount = count($users);
        // 每个用户平均分得的金额
        $perUserAmount = floor($totalAmount / $userCount); // 去掉小数部分
        
        if ($perUserAmount <= 0) {
            \think\Log::info('[团队加权] 等级 ' . $level . ' 分配金额过小，无需分配');
            return;
        }
        
        // 初始化总分配金额和用户ID列表
        $distributedTotal = 0;
        $userIds = [];
        
        // 给每个用户分配金额
        foreach ($users as $user) {
            $beforeMoney = $user->money;
            $user->money += $perUserAmount;
            $afterMoney = $user->money;
            $user->save();
            
            // 累计总分配金额
            $distributedTotal += $perUserAmount;
            
            // 收集用户ID
            $userIds[] = $user->id;
            
            // 记录权益值变动日志
            \app\admin\model\user\money\Log::recordTeamEquityValue(
                $user->id,
                $perUserAmount,
                $beforeMoney,
                $afterMoney,
                '团队加权奖励(' . $level . ')',
                '绿色积分'  // type2字段设置为绿色积分
            );
            
            \think\Log::info('[团队加权] 用户ID: ' . $user->id . ', 等级: ' . $level . ', 获得金额: ' . $perUserAmount);
        }
        
        // 从分红池扣除已分配的总金额
        $dividendPool = new \app\admin\model\DividendPool();
        $dividendPool->deduct(
            $distributedTotal,
            null, // order_id
            null, // batch_id
            '团队加权奖励(' . $level . ')分配支出，共' . $userCount . '人，每人' . $perUserAmount . '元，用户IDs: ' . implode(',', $userIds),
        );
        
        // 记录think日志，包含所有用户ID
        \think\Log::info('[团队加权] 等级 ' . $level . ' 分配完成，用户数: ' . $userCount . '，每人分得: ' . $perUserAmount . '，总分配金额: ' . $distributedTotal . '，已从分红池扣除相应金额，用户IDs: ' . implode(',', $userIds));
    }
    

}
